#ifndef MY_SHELL_ACTION_SCOPE_H
#define MY_SHELL_ACTION_SCOPE_H

#include <cstdint>
#include <vector>
#include <string>
#include <unordered_map>
#include <memory>

#include "MyShellNamespace.h"
#include "MyShellWord.h"
#include "MyShellGrammarNode.h"

MY_SHELL_NAMESPACE_BEGIN
// 变量信息
class VariableInfo
{
public:
    // 公有变量信息
    // 维度
    std::int32_t dimension;
    // 数据类型
    mysh::WORD_TYPE data_type;
    // 各维度大小
    std::vector<std::size_t> size_of_every_demension;
public:
    // 构造及析构函数
    VariableInfo();
    VariableInfo(const std::int32_t& dimension, mysh::WORD_TYPE data_type, const std::vector<std::size_t>& size_of_every_demension);
    ~VariableInfo();
};

// 作用域
class MyShellActionScope
{
public:
    // 共有成员变量
    // 所有声明的变量名及其对应的维度、数据类型、各维度大小
    std::unordered_map<std::string, mysh::VariableInfo> declared_variables;
    // bool类型变量的值
    std::unordered_map<std::string, bool> bool_values;
    // int类型变量的值
    std::unordered_map<std::string, std::int32_t> int_values;
    // string类型变量的值
    std::unordered_map<std::string, std::string> string_values;
    // bool数组类型变量的值
    std::unordered_map<std::string, std::vector<bool>> bool_array_values;
    // int数组类型变量的值
    std::unordered_map<std::string, std::vector<std::int32_t>> int_array_values;
    // string数组类型变量的值
    std::unordered_map<std::string, std::vector<std::string>> string_array_values;
    // bool类型返回值寄存器
    bool register_bool_return;
    // int类型返回值寄存器
    std::int32_t register_int_return;
    // string类型返回值寄存器
    std::string register_string_return;
public:
    // 构造及析构函数
    MyShellActionScope() = default;
    ~MyShellActionScope();
public:
    // 公有辅助函数
    // 添加声明的变量
    void addDeclaredVariables(const std::shared_ptr<mysh::DeclareStatementNode>& declare_statement);
};
MY_SHELL_NAMESPACE_END

#endif // ! MY_SHELL_ACTION_SCOPE_H